package generics;

import domain.Customer;
class Animal{}
class Dog extends Animal{}
class Lion extends Animal{}
//가변 타입을 지정할때 타입을 지정할 수 있다. 
/*
 * Generics : 클래스 내에서 사용할 데이터 타입(reference 타입)을
 * 디자인시(클래스 작성시) 정하는 것이 아니라 그 클래스를 사용하는 시점에 정하는 기술.
 * JDK1.5 에서 추가됨
 * 
 * Object type의 문제점 - 형변환을 반드시 해야 한다. 
 * 형변환시의 안전성에 문제가 있다. 
 * ->해결책이 제너릭스
 */
class GenericsCalss1<E>{//<E>가변타입 : <타입명> - 식별자 규칙
	public void foo(E o){//이 클래스를 만들때는 타입을 지정하지 않았다가 사용할때 정하고 싶을때 
		
	}
}
class GenericsTest2<E, R>{//가변 타입 여러개 선언 가능 : <타입명, 타입명...>
	public void go(E e){}
	public void come(R r){}
}

class GenerisClass3<A extends Animal>{//가변 타입으로 선언 가능한 타입에 제한걸기<타입명 extends 상위타입명> A에 지정할 수 있는 타입은 Animal 타입만 가능

public class GenericsTest {
	public static void main(String[] args) {
		GenericsCalss1<String> c = new GenericsCalss1<String>();//호출하는 쪽에서 타입을 결정하는것
		GenericsCalss1<Customer> c2 = new GenericsCalss1<Customer>();
		c2.foo(new Customer("id-1:,","이름",20));
		c.foo("abc");
		
		c2.foo(new Customer());
		
		GenericsClass2<String, String> cc = new GenericsClass2<String,String>();
		GenericsClass2<String, Integer> cc2 = new GenericsClass2<String,Integer>();
		
	}
}